package com.briup.jd2511.jd2511bookstore.proxy.cglib;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

//Cglib测试类
public class CglibTest {
    public static void main(String[] args) {
        //1.创建Enhancer对象，其是CGLIB库中核心类，用于生成目标类的子类代理对象
        //通过该对象，我们可以设置代理类的父类、回调函数等，从而实现对目标类方法的增强
        Enhancer enhancer = new Enhancer();

        //2.设置代理类的父类对象
        enhancer.setSuperclass(CglibTarget.class);

        //3.设置回调函数，参数为核心方法拦截器【匿名内部类】
        enhancer.setCallback(new MethodInterceptor() {
            /**
             * @param proxy 代理对象实例
             * @param method 目标类中的方法对象
             * @param args 方法参数
             * @param methodProxy 方法代理对象
             */
            @Override
            public Object intercept(Object proxy,
                                    Method method,
                                    Object[] args,
                                    MethodProxy methodProxy) throws Throwable {
                System.out.println("开启事务...");

                //执行父类中被代理的方法，等同：目标对象.method(args)
                Object result = methodProxy.invokeSuper(proxy, args);

                System.out.println("提交事务...");

                //返回核心方法执行结果
                return result;
            }
        });

        //4.产生代理对象，并调用方法
        CglibTarget proxy = (CglibTarget) enhancer.create();
        proxy.saveOrUpdate();

        //输出代理对象所属类似
        System.out.println("proxy类型：" + proxy.getClass());
    }
}
